package 多线程;

/**
 * 注意:死锁不会出现代码异常,所以一定要知道死锁怎么写,不然不小心写了死锁代码导致运行不出结果但是发现不了异常就不好
 * 结果中可以看到：产生了"死锁",互相占据资源
 *
 * 死锁问题的解决：
 * 1.及时释放锁,就是缩小同步代码块的范围,使用锁结束后及时释放,这是一种解决死锁的方式
 *
 */
// 2025-10-16: 快手面试题,没写出来
public class 死锁 {
    //两个线程共享obj1、obj2
    public static String obj1 = "obj1";
    public static String obj2 = "obj2";
    public static void main(String[] args) {
        Thread lockA = new Thread(){
            @Override
            public void run() {
                try {
                    System.out.println("LockA 开始执行");
                    while (true) {
                        synchronized (死锁.obj1) {
                            System.out.println("LockA 锁住 obj1");
                            Thread.sleep(3000); // 此处等待是给B能锁住机会
                            synchronized (死锁.obj2) {
                                System.out.println("LockA 锁住 obj2");
                                Thread.sleep(60 * 1000);//占据资源
                            }
                        }
                    }
                } catch (InterruptedException e) {//报错了,根据IDEA的自动提示修改
                    e.printStackTrace();
                }
            }
        };
        Thread lockB = new Thread(){
            @Override
            public void run() {
                try {
                    System.out.println("LockB 开始执行");
                    while (true) {
                        synchronized (死锁.obj2) {
                            System.out.println("LockB 锁住 obj2");
                            Thread.sleep(3000);//给A能锁住机会
                            synchronized (死锁.obj1) {
                                System.out.println("LockB 锁住 obj1");
                                Thread.sleep(60 * 1000); //占据资源
                            }
                        }
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        //注意这里：由于代码实现里,两个线程都有可能锁住共享资源,所以这里就与那个线程先执行有关系了
        lockA.start();
        lockB.start();
    }
}